package cn.skillith.showcompanybackend.service;

import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.regex.Pattern;

@Service
public class SecurityService {
    
    // 邮箱格式验证
    private static final Pattern EMAIL_PATTERN = Pattern.compile(
        "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
    );
    
    // 手机号格式验证
    private static final Pattern PHONE_PATTERN = Pattern.compile(
        "^1[3-9]\\d{9}$"
    );
    
    // 敏感词列表（实际项目中应该从数据库或配置文件读取）
    private static final String[] SENSITIVE_WORDS = {
        "垃圾", "废物", "傻逼", "操你", "fuck", "shit", "damn"
    };
    
    // 最大消息长度
    private static final int MAX_MESSAGE_LENGTH = 2000;
    private static final int MAX_NAME_LENGTH = 50;
    private static final int MAX_EMAIL_LENGTH = 100;
    private static final int MAX_PHONE_LENGTH = 20;
    
    /**
     * 验证邮箱格式
     */
    public boolean isValidEmail(String email) {
        if (!StringUtils.hasText(email)) {
            return false;
        }
        return EMAIL_PATTERN.matcher(email).matches();
    }
    
    /**
     * 验证手机号格式
     */
    public boolean isValidPhone(String phone) {
        if (!StringUtils.hasText(phone)) {
            return true; // 手机号是可选的
        }
        return PHONE_PATTERN.matcher(phone).matches();
    }
    
    /**
     * 检查是否包含敏感词
     */
    public boolean containsSensitiveWords(String text) {
        if (!StringUtils.hasText(text)) {
            return false;
        }
        
        String lowerText = text.toLowerCase();
        for (String word : SENSITIVE_WORDS) {
            if (lowerText.contains(word.toLowerCase())) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * 验证输入长度
     */
    public boolean isValidLength(String text, int maxLength) {
        if (text == null) {
            return true;
        }
        return text.length() <= maxLength;
    }
    
    /**
     * 验证联系表单数据
     */
    public String validateContactForm(String name, String email, String phone, String message) {
        // 验证必填字段
        if (!StringUtils.hasText(name)) {
            return "姓名不能为空";
        }
        if (!StringUtils.hasText(email)) {
            return "邮箱不能为空";
        }
        if (!StringUtils.hasText(message)) {
            return "消息内容不能为空";
        }
        
        // 验证长度
        if (!isValidLength(name, MAX_NAME_LENGTH)) {
            return "姓名长度不能超过" + MAX_NAME_LENGTH + "个字符";
        }
        if (!isValidLength(email, MAX_EMAIL_LENGTH)) {
            return "邮箱长度不能超过" + MAX_EMAIL_LENGTH + "个字符";
        }
        if (phone != null && !isValidLength(phone, MAX_PHONE_LENGTH)) {
            return "手机号长度不能超过" + MAX_PHONE_LENGTH + "个字符";
        }
        if (!isValidLength(message, MAX_MESSAGE_LENGTH)) {
            return "消息内容长度不能超过" + MAX_MESSAGE_LENGTH + "个字符";
        }
        
        // 验证格式
        if (!isValidEmail(email)) {
            return "邮箱格式不正确";
        }
        if (phone != null && !isValidPhone(phone)) {
            return "手机号格式不正确";
        }
        
        // 检查敏感词
        if (containsSensitiveWords(name) || containsSensitiveWords(message)) {
            return "输入内容包含不当词汇，请修改后重试";
        }
        
        return null; // 验证通过
    }
    
    /**
     * 清理输入内容，防止XSS攻击
     */
    public String sanitizeInput(String input) {
        if (!StringUtils.hasText(input)) {
            return input;
        }
        
        return input
            .replace("<", "&lt;")
            .replace(">", "&gt;")
            .replace("\"", "&quot;")
            .replace("'", "&#x27;")
            .replace("&", "&amp;");
    }
    
    /**
     * 检查IP是否在黑名单中
     */
    public boolean isIpBlacklisted(String ipAddress) {
        // 这里可以实现IP黑名单检查
        // 可以从数据库或配置文件读取黑名单IP
        return false;
    }
    
    /**
     * 检查是否为可疑请求（短时间内大量请求）
     */
    public boolean isSuspiciousRequest(String ipAddress, String userAgent) {
        // 这里可以实现请求频率检查
        // 可以结合Redis实现分布式限流
        return false;
    }
}
